home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / listmo.aqm / listmo.asm
Assembly Source File  |  1984-04-22  |  25KB  |  904 lines

  1.  
  2.         name    list
  3.         page    55,132
  4.         title   'LIST --- Print text file'
  5.  
  6. ; LIST --- a utility to print out text files with titles and page 
  7. ; numbers on  the current list device.  The high bit of all 
  8. ; characters is  stripped, so that raw Wordstar or other word 
  9. ; processing files can  be listed. Embedded form feed codes are 
  10. ; recognized, and tabs are  expanded.  Unknown control codes (such 
  11. ; as the ^B and ^U codes found in Wordstar documents) are discarded. 
  12. ; If using an Epson printer, compressed mode can be turned on with
  13. ; /C switch in command so that lines up to 128 characters long will 
  14. ; fit on a normal page.  Requires PC-DOS 2.0 or MS-DOS 2.0.
  15.  
  16. ; Used in the form:
  17. ; A>LIST path\filename.ext  ["title text"]  [/C] [/D] [/E]
  18. ; (items in square brackets are optional)
  19.  
  20. ; version 1.0   February 28, 1984
  21. ; Copyright (c) 1984 by Ray Duncan
  22. ; May be freely reproduced for non-commercial use. 
  23.  
  24. ; version 1.1   April 8, 1985
  25. ; by M. Michael Shabot, M.D.
  26. ; added two print options:  /E for Epson "emphasised" print mode
  27. ;                           /D for Epson "double strike" mode
  28. ; [the /C /D and /E switches may be used in any combination,
  29. ;  although /E (pica-sized) will override /C (condensed)]
  30.  
  31. cr      equ     0dh             ;ASCII carriage return
  32. lf      equ     0ah             ;ASCII line feed
  33. ff      equ     0ch             ;ASCII form feed
  34. eof     equ     01ah            ;End of file marker
  35. tab     equ     09h             ;ASCII tab character
  36.  
  37. command equ     80h             ;buffer for command tail
  38.  
  39. blksize equ     1024            ;size of block reads from input file
  40. linesize equ    132             ;maximum length of output line
  41. pagesize equ    58              ;number of lines per page
  42. heading_lines equ 3             ;number of lines in page heading
  43.  
  44. output_handle equ 4             ;handle of standard list device
  45.         
  46. cseg    segment para public 'CODE'
  47.  
  48.         assume  cs:cseg,ds:data,es:data,ss:stack
  49.  
  50.  
  51. list    proc    far             ;entry point from PC-DOS
  52.  
  53.         push    ds              ;save DS:0000 for final
  54.         xor     ax,ax           ;return to PC-DOS
  55.         push    ax
  56.         mov     ax,data         ;make our data segment
  57.         mov     es,ax           ;addressable via ES register.
  58.         call    get_title       ;get listing title from
  59.                                 ;command line tail.
  60.         call    get_switch      ;look for /C switch if any
  61.         call    get_emphasis    ;look for /E switch if any
  62.         call    get_doublestrike;look for /D switch if any
  63.         call    get_filename    ;get path and file spec. for
  64.                                 ;input file from command line tail.
  65.         mov     ax,es           ;set DS=ES for remainder
  66.         mov     ds,ax           ;of program.
  67.         jnc     list13          ;jump, got acceptable name.
  68.         mov     dx,offset msg2  ;missing or illegal filespec,
  69.         jmp     list9           ;print error message and exit.
  70.  
  71. list13:                         ;make sure we're running under DOS 2.0.
  72.         mov     ah,30h
  73.         int     21h
  74.         cmp     al,2
  75.         jae     list15          ;proceed, DOS 2.0 or greater
  76.         mov     dx,offset msg3  ;DOS 1.x --- print error message
  77.         jmp     list9
  78.  
  79. list15: call    open_input      ;now try to open input file
  80.         jnc     list2           ;jump,opened input ok
  81.         mov     dx,offset msg1  ;open of input file failed,
  82.         jmp     list9           ;print error msg and exit.
  83.  
  84. list2:
  85.         test    compress_switch,-1 ;was /C switch found?
  86.         jz      list65          ;no,jump
  87.         call    compress_on     ;yes,turn on compressed print mode
  88.  
  89. list65:
  90.         test    emphasis_switch,-1 ;was /E switch found?
  91.         jz      list66          ;no,jump
  92.         call    emphasis_on     ;yes,turn on emphasised print mode
  93.  
  94. list66:
  95.         test    doublestrike_switch,-1 ;was /D switch found?
  96.         jz      list25                 ;no,jump
  97.         call    doublestrike_on        ;yes,turn on doublestrike print mode
  98.  
  99.  
  100. list25: call    init_buff       ;initialize input deblocking buffer
  101.  
  102.                                 ;file successfully opened,             
  103. list3:                          ;now print it! 
  104.         call    get_char        ;read 1 character from input.
  105.         and     al,07fh         ;strip off the high bit
  106.         cmp     al,20h          ;is it a control code?
  107.         jae     list4           ;no,write it to list device. 
  108.                                 ;yes it is control code,
  109.         cmp     al,eof          ;is it end of file marker?
  110.         je      list8           ;yes,jump to close files.
  111.         cmp     al,tab          ;is it a tab command?
  112.         je      list5           ;yes,jump to special processing.
  113.         cmp     al,ff           ;is it a form feed? 
  114.         je      list6           ;yes, jump to special processing. 
  115.         cmp     al,lf           ;is it a line feed?
  116.         je      list7           ;yes,jump to special processing.
  117.         cmp     al,cr           ;if illegal control code, 
  118.         jne     list3           ;discard it and get next char.
  119.         mov     column,0        ;if carriage return, store it into output
  120.         jmp     list45          ;string and initialize column count.
  121.  
  122. list4:                          ;count chars. sent on this line.
  123.         inc     column
  124.  
  125. list45:                         ;write this character into 
  126.         call    put_char        ;forming output string. 
  127.                                 ;is output buffer about to overflow?
  128.         cmp     output_ptr,linesize-1
  129.         je      list7           ;yes, force print of buffer.
  130.         jmp     list3           ;no, get next char. from input file.
  131.  
  132. list5:                          ;process tab character
  133.         mov     ax,column       ;let DX:AX=column count
  134.         cwd
  135.         mov     cx,8            ;divide it by eight...
  136.         idiv    cx
  137.         sub     cx,dx           ;remainder is in DX.
  138.         add     column,cx       ;update column pointer.
  139. list55:                         ;8 minus the remainder 
  140.         push    cx              ;gives us the number of
  141.         mov     al,20h          ;spaces to send out to
  142.         call    put_char        ;move to the next tab position
  143.         pop     cx              ;restore space count
  144.         loop    list55
  145.         jmp     short list3     ;get next character 
  146.  
  147. list6:                          ;form feed detected
  148.         call    write_maybe     ;if anything waiting in output
  149.                                 ;buffer, print it first
  150.         call    print_heading   ;new page and print title
  151.         jmp     list3           ;get next character from input
  152.  
  153. list7:                          ;line feed detected, interpreted
  154.                                 ;as print command.
  155.         call    heading_maybe   ;print heading if needed
  156.         call    write_line      ;print contents of text buffer
  157.         jmp     list3           ;get more from input file
  158.  
  159. list8:                          ;end of file detected,
  160.         call    write_maybe     ;print anything that's waiting
  161.                                 ;in output buffer. 
  162.         mov     al,ff           ;send form feed to finish listing.
  163.         call    put_char        
  164.         call    write_line      
  165.         call    close_input     ;close input file. 
  166.                                 ;turn off compressed print mode,
  167.                                 ;if it was enabled.
  168.         test    compress_switch,-1
  169.         jz      list75
  170.         call    compress_off
  171. list75:                         ;turn off emphasised print mode,
  172.                                 ;if it was enabled.
  173.         test    emphasis_switch,-1
  174.         jz      list76
  175.         call    emphasis_off
  176. list76:                         ;turn off doublestrike print mode,
  177.                                 ;if it was enabled.
  178.         test    doublestrike_switch,-1
  179.         jz      list85
  180.         call    doublestrike_off        
  181. list85: ret                     ;now return to PC-DOS.
  182.  
  183. list9:                          ;come here to print error message 
  184.         mov     ah,9            ;and return control to PC-DOS
  185.         int     21h
  186.         ret
  187.  
  188. list    endp
  189.  
  190.  
  191. get_filename proc near          ;process name of input file
  192.                                 ;DS:SI <- addr command line     
  193.         mov     si,offset command
  194.                                 ;ES:DI <- addr filespec buffer
  195.         mov     di,offset input_name
  196.         cld
  197.         lodsb                   ;any command line present?
  198.         or      al,al           ;return error status if not.
  199.         jz      get_filename4
  200. get_filename1:                  ;scan over leading blanks
  201.         lodsb                   ;to file name
  202.         cmp     al,cr           ;if we hit carriage return
  203.         je      get_filename4   
  204.         cmp     al,'/'          ;or switch,
  205.         je      get_filename4
  206.         cmp     al,'"'          ;or quote mark, filename missing.
  207.         je      get_filename4   ;so go return error flag.
  208.         cmp     al,20h          ;is this a blank?
  209.         jz      get_filename1   ;if so keep scanning.
  210. get_filename2:                  ;found first char of name,
  211.         stosb                   ;move last char. to output
  212.                                 ;file name buffer. 
  213.         lodsb                   ;check next character, found
  214.         cmp     al,cr           ;carriage return yet?   
  215.         je      get_filename3   ;yes,exit with success code.
  216.         cmp     al,'"'          ;same if quote encountered.
  217.         je      get_filename3
  218.         cmp     al,20h          ;is this a blank?
  219.         jne     get_filename2   ;if not keep moving chars.
  220. get_filename3:                  ;exit with carry =0
  221.         clc                     ;for success flag
  222.         ret
  223. get_filename4:                  ;exit with carry =1
  224.         stc                     ;for error flag
  225.         ret
  226. get_filename endp 
  227.  
  228.  
  229. get_title proc near             ;process title for listing
  230.                                 ;DS:SI <- addr command line     
  231.         mov     si,offset command
  232.                                 ;ES:DI <- addr page heading buffer
  233.         mov     di,offset heading1 
  234.         cld
  235.         lodsb                   ;any command line present?
  236.         or      al,al           ;no,exit
  237.         jz      get_title3
  238. get_title1:                     ;scan for leading <"> to find title.
  239.         lodsb                   
  240.         cmp     al,cr           ;if we hit carriage return,
  241.         je      get_title3      ;title text is missing.
  242.         cmp     al,'"'          ;found delimiter?
  243.         jne     get_title1      ;if so keep scanning.
  244. get_title2:                     ;get next char. of title. 
  245.         lodsb                   
  246.         cmp     al,'"'          ;terminate if 2nd <"> delimiter
  247.         je      get_title3      ;or carriage return found
  248.         cmp     al,cr
  249.         je      get_title3
  250.         stosb                   ;store this char. into page heading buffer
  251.         jmp     get_title2      ;examine next char.
  252. get_title3: 
  253.         ret
  254. get_title endp 
  255.  
  256. get_switch proc near            ;Scan the input line for a "/"
  257.                                 ;delimiting a switch, then make
  258.                                 ;sure it is legal "/C" or "/c".  
  259.                                 ;If legal switch found, set 
  260.                                 ;variable COMPRESS_SWITCH true.
  261.         mov     si,offset command+1  ; DS:SI = addr of command line
  262. get_switch1:                    ;look for "/" character
  263.         lodsb
  264.         cmp     al,cr           ;if we run into a carriage return,
  265.         jz      get_switch2     ;switch missing so take normal exit.
  266.         cmp     al,'/'  
  267.         jne     get_switch1     ;not '/' yet, keep looking.
  268.         lodsb                   ;found '/', pick up next char.
  269.         or      al,20h          ;and fold to lower case.
  270.         cmp     al,'c'          ;c=compress 
  271.         jne     get_switch1     ;not c, jump
  272.                                 ;set compress switch
  273.         mov     es:compress_switch,-1
  274. get_switch2:                    
  275.         ret                     ;exit 
  276. get_switch endp
  277.  
  278. get_emphasis proc near          ;Scan the input line for a "/"
  279.                                 ;delimiting a switch, then make
  280.                                 ;sure it is legal "/E" or "/e".  
  281.                                 ;If legal switch found, set 
  282.                                 ;variable EMPHASIS_SWITCH true.
  283.         mov     si,offset command+1  ; DS:SI = addr of command line
  284. get_emphasis1:                  ;look for "/" character
  285.         lodsb
  286.         cmp     al,cr           ;if we run into a carriage return,
  287.         jz      get_emphasis2   ;switch missing so take normal exit.
  288.         cmp     al,'/'  
  289.         jne     get_emphasis1   ;not '/' yet, keep looking.
  290.         lodsb                   ;found '/', pick up next char.
  291.         or      al,20h          ;and fold to lower case.
  292.         cmp     al,'e'          ;e=emphasis 
  293.         jne     get_emphasis1   ;not e, jump
  294.                                 ;set emphasis switch
  295.         mov     es:emphasis_switch,-1
  296. get_emphasis2:                    
  297.         ret                     ;exit 
  298. get_emphasis endp
  299.  
  300. get_doublestrike proc near      ;Scan the input line for a "/"
  301.                                 ;delimiting a switch, then make
  302.                                 ;sure it is legal "/D" or "/d".  
  303.                                 ;If legal switch found, set 
  304.                                 ;variable DOUBLESTRIKE_SWITCH true.
  305.         mov     si,offset command+1  ; DS:SI = addr of command line
  306. get_doublestrike1:              ;look for "/" character
  307.         lodsb
  308.         cmp     al,cr           ;if we run into a carriage return,
  309.         jz      get_doublestrike2   ;switch missing so take normal exit.
  310.         cmp     al,'/'  
  311.         jne     get_doublestrike1   ;not '/' yet, keep looking.
  312.         lodsb                   ;found '/', pick up next char.
  313.         or      al,20h          ;and fold to lower case.
  314.         cmp     al,'d'          ;d=doublestrike 
  315.         jne     get_doublestrike1   ;not d, jump
  316.                                 ;set doublestrike switch
  317.         mov     es:doublestrike_switch,-1
  318. get_doublestrike2:                    
  319.         ret                     ;exit 
  320. get_doublestrike endp
  321.  
  322. open_input proc near            ;open input file
  323.                                 ;DS:DX=addr filename
  324.         mov     dx,offset input_name
  325.         mov     al,0            ;AL=0 for read only
  326.         mov     ah,3dh          ;function 3dh=open
  327.         int     21h             ;handle returned in AX,
  328.         mov     input_handle,ax ;save it for later.
  329.         ret                     ;CY is set if error
  330. open_input endp
  331.  
  332. close_input proc near           ;close input file
  333.         mov     bx,input_handle ;BX=handle
  334.         mov     ah,3eh
  335.         int     21h
  336.         ret
  337. close_input endp
  338.  
  339. get_char proc   near            ;get one character from input buffer
  340.         mov     bx,input_ptr    ;is pointer at end of buffer?
  341.         cmp     bx,blksize      
  342.         jne     get_char1       ;no,jump
  343.                                 ;yes, buffer is exhausted, 
  344.         call    read_block      ;new block must be read from disk.
  345.         mov     bx,0            ;initialize buffer pointer.
  346. get_char1:
  347.         mov     al,[input_buffer+bx]
  348.         inc     bx              ;bump input buffer pointer
  349.         mov     input_ptr,bx
  350.         ret
  351. get_char endp   
  352.  
  353. put_char proc   near            ;put one character into output buffer
  354.         mov     bx,output_ptr
  355.         mov     [output_buffer+bx],al
  356.         inc     output_ptr      ;bump pointer to output string
  357.         ret
  358. put_char endp
  359.  
  360. read_block proc near            ;read block of data from input file.
  361.         mov     bx,input_handle 
  362.         mov     cx,blksize
  363.         mov     dx,offset input_buffer
  364.         mov     ah,3fh
  365.         int     21h
  366.         jnc     read_block1     ;jump if no error status
  367.         mov     ax,0            ;simulate a zero length read if error
  368. read_block1:                    
  369.         cmp     ax,blksize      ;was full buffer read in?
  370.         je      read_block2     ;yes,jump
  371.         mov     bx,ax           ;no, store End-of-File mark
  372.         mov     byte ptr [input_buffer+bx],eof
  373. read_block2:
  374.         mov     input_ptr,0     ;initialize pointer to input buffer.
  375.         ret
  376. read_block endp
  377.  
  378. write_maybe proc near           ;transmit line to list device, if
  379.                                 ;output buffer contains anything.
  380.         mov     ax,output_ptr   ;pointer is non-zero if characters
  381.         or      ax,ax           ;are waiting in buffer.
  382.         jz      write_maybe1    ;nothing, jump to exit
  383.         call    write_line      ;something there, send it to printer
  384. write_maybe1:
  385.         ret                     
  386. write_maybe endp
  387.  
  388. write_line proc near            ;transmit contents of output
  389.                                 ;buffer to the standard list device.
  390.         mov     al,lf           ;append line feed to string.
  391.         call    put_char
  392.         mov     cx,output_ptr   ;CX contains length of string
  393.                                 ;DX:DX=buffer address
  394.         mov     dx,offset output_buffer
  395.         mov     bx,output_handle;BX=handle for standard list device.
  396.         mov     ah,40h          ;function 40h=write to device.
  397.         int     21h             ;request service from DOS.
  398.         inc     linecount       ;count lines printed this page.
  399.         mov     output_ptr,0    ;reset pointer to list device buffer
  400.         ret
  401. write_line endp
  402.  
  403. heading_maybe proc near         ;print heading if the line
  404.                                 ;count justifies it
  405.         cmp     linecount,pagesize
  406.         jl      heading_maybe2  ;jump,page not full yet
  407.         call    print_heading   ;form feed and print title
  408. heading_maybe2:
  409.         ret
  410. heading_maybe endp
  411.  
  412. print_heading proc near         ;print form feed, title, and page no.
  413.         inc     pagecount       ;bump page number, 
  414.         mov     ax,pagecount    ;load it, 
  415.         aam                     ;and turn it into ASCII,
  416.         add     ax,'00'
  417.         mov     heading2,ah     ;then store into heading string.
  418.         mov     heading2+1,al
  419.                                 ;now print the heading string.
  420.         mov     dx,offset heading_buffer
  421.         mov     cx,heading_length
  422.         mov     bx,output_handle
  423.         mov     ah,40h
  424.         int     21h
  425.                                 ;initialize line count
  426.         mov     linecount,heading_lines
  427.         mov     column,0        ;and column counter
  428.         ret
  429. print_heading endp
  430.  
  431. init_buff proc near             ;initialize i/o buffers 
  432.         call    read_block      ;read 1st block of input file
  433.         mov     output_ptr,0    ;initialize pointer to output string
  434.         ret
  435. init_buff endp
  436.  
  437. compress_on proc near           ;turn on compressed printing mode
  438.                                 ;by sending command string.
  439.         mov     cx,comp_command_length
  440.         mov     bx,output_handle
  441.         mov     dx,offset comp_command
  442.         mov     ah,40h
  443.         int     21h
  444.         ret
  445. compress_on endp
  446.  
  447. compress_off proc near          ;turn off compressed printing mode
  448.                                 ;by sending command string.
  449.         mov     cx,norm_command_length
  450.         mov     bx,output_handle
  451.         mov     dx,offset norm_command
  452.         mov     ah,40h
  453.         int     21h
  454.         ret
  455. compress_off endp
  456.  
  457. emphasis_on proc near           ;turn on emphasised printing mode
  458.                                 ;by sending command string.
  459.         mov     cx,emphasis_on_command_length
  460.         mov     bx,output_handle
  461.         mov     dx,offset emphasis_on_command
  462.         mov     ah,40h
  463.         int     21h
  464.         ret
  465. emphasis_on endp
  466.  
  467. emphasis_off proc near          ;turn off emphasised printing mode
  468.                                 ;by sending command string.
  469.         mov     cx,emphasis_off_command_length
  470.         mov     bx,output_handle
  471.         mov     dx,offset emphasis_off_command
  472.         mov     ah,40h
  473.         int     21h
  474.         ret
  475. emphasis_off endp
  476.  
  477. doublestrike_on proc near       ;turn on doublestrike printing mode
  478.                                 ;by sending command string.
  479.         mov     cx,doublestrike_on_command_length
  480.         mov     bx,output_handle
  481.         mov     dx,offset doublestrike_on_command
  482.         mov     ah,40h
  483.         int     21h
  484.         ret
  485. doublestrike_on endp
  486.  
  487. doublestrike_off proc near      ;turn off doublestrike printing mode
  488.                                 ;by sending command string.
  489.         mov     cx,doublestrike_off_command_length
  490.         mov     bx,output_handle
  491.         mov     dx,offset doublestrike_off_command
  492.         mov     ah,40h
  493.         int     21h
  494.         ret
  495. doublestrike_off endp
  496.  
  497. cseg    ends
  498.  
  499.  
  500. data    segment para public 'DATA'
  501.  
  502. input_name      db      64 dup (0)      ;buffer for input filespec
  503.  
  504. input_handle    dw      0               ;token from PCDOS for input file.
  505.  
  506. input_ptr       dw      0               ;pointer to input blocking buffer
  507. output_ptr      dw      0               ;pointer to output blocking buffer
  508.  
  509. column          dw      0               ;column count for tab processing
  510. linecount       dw      pagesize        ;line counter, current page.  
  511.                                         ;(set to "pagesize" initially to
  512.                                         ;force first heading on listing)
  513. pagecount       dw      0               ;current page number
  514.  
  515. compress_switch dw      0               ;set to -1 if /C switch
  516.                                         ;found in command line tail.
  517.  
  518. comp_command    db      0fh             ;command string for compressed mode 
  519. comp_command_length equ $-comp_command
  520.  
  521. norm_command    db      12h             ;command string for normal print
  522. norm_command_length equ $-norm_command
  523.  
  524. emphasis_switch dw      0               ;set to -1 if /E switch
  525.                                         ;found in command line tail.
  526.  
  527. emphasis_on_command    db      1Bh,45h  ;command string for emphasised mode 
  528. emphasis_on_command_length equ $-emphasis_on_command
  529.  
  530. emphasis_off_command    db      1Bh,46h ;command string for non-emphasised print
  531. emphasis_off_command_length equ $-emphasis_off_command
  532.  
  533. doublestrike_switch dw      0           ;set to -1 if /D switch
  534.                                         ;found in command line tail.
  535.  
  536. doublestrike_on_command    db   1Bh,47h ;command string for doublestrike mode 
  537. doublestrike_on_command_length equ $-doublestrike_on_command
  538.  
  539. doublestrike_off_command   db   1Bh,48h ;command string for non-doublestrike print
  540. doublestrike_off_command_length equ $-doublestrike_off_command
  541.  
  542. msg1            db      cr,lf
  543.                 db      'Cannot find file to be printed.'
  544.                 db      cr,lf,'$'
  545.  
  546. msg2            db      cr,lf
  547.                 db      'Missing file name.'
  548.                 db      cr,lf,'$'
  549.  
  550. msg3            db      cr,lf
  551.                 db      'Requires PC-DOS version 2 or greater.'
  552.                 db      cr,lf,'$'
  553.  
  554. input_buffer    db      blksize dup (?) ;deblocking buffer for input file
  555.  
  556. output_buffer   db      linesize dup (?);buffer used to build output
  557.                                         ;lines for list device
  558.  
  559. heading_buffer  db      ff              ;form feed control code
  560. heading1        db      60 dup (' ')    ;filled in with title from user
  561.                 db      'Page '
  562. heading2        db      '00',cr
  563.                 db      heading_lines dup (lf) 
  564. heading_length  equ     $-heading_buffer
  565.  
  566.  
  567. data    ends    
  568.  
  569.  
  570. stack   segment para stack 'STACK'
  571.         db      64 dup (?)
  572. stack   ends
  573.  
  574.         end     list
  575. 
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804. Press ENTER to continue: 
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811.  
  812.  
  813.  
  814.  
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867.  
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904. Press ENTER to continue